Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核

帖子发起人: Alex.xu   发起时间: 2009-09-03 15:28 下午   回复: 7

Print Search
帖子排序:    
   2009-09-03, 15:28 下午
xqj2002zm 离线,最后访问时间: 2010/6/24 5:19:33 Alex.xu

发帖数前50位
注册: 2009-07-23
发 贴: 21
<软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
Reply Quote
hi 各位牛人,

问题如题, 我感觉ring 3下也可以使用这个汇编指令?
不知道是作者的失误还是我的问题.


thanks




IP 地址: 已记录   报告
   2009-09-03, 17:31 下午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
Reply Quote
楼主没错~

SIDT is only useful in operating-system software; however, it can be used in application
programs without causing an exception to be generated.
IP 地址: 已记录   报告
   2009-09-03, 17:45 下午
xqj2002zm 离线,最后访问时间: 2010/6/24 5:19:33 Alex.xu

发帖数前50位
注册: 2009-07-23
发 贴: 21
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
Reply Quote
谢谢 王宇~~

随便问一下, 有没有办法可以让用户态程序读取内核保护模式下的数据?
因为我用sidt找到了IDT的地址,我想把它的所有信息拷贝出来.

希望给个思路
能不能将自己的程序跳入系统ring 0

IP 地址: 已记录   报告
   2009-09-03, 17:58 下午
MJ0011 离线,最后访问时间: 2009/12/24 22:33:41 MJ0011

发帖数前10位
注册: 2008-04-24
发 贴: 112
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
Reply Quote
sidt当然可以在RING3下使用。

如果要从用户态读取内核态保护模式的数据,可以用ZwSystemDebugControl或PhysicalMemory的方法来获取。
也可以使用某种方式给GDT添加一个CALLGATE,然后CALL CALLGATE,让程序跳入RING0执行
这是我常用的一个代码:
void AddCallGate()
{
ULONG Gdt_Addr;
BYTE CallGateData[0x10];
ULONG Icount;


__asm
{


pushfd
pushad


push edx
sgdt [esp-2]
pop edx



mov Gdt_Addr,edx

push 0xc3
push Gdt_Addr
call WriteMemory

;write the call gate type

mov eax,Gdt_Addr
mov word ptr[CallGateData],ax
shr eax,16
mov word ptr[CallGateData+6],ax
mov dword ptr[CallGateData+2],0x0ec0003e8
mov dword ptr[CallGateData+8],0x0000ffff
mov dword ptr[CallGateData+12],0x00cf9a00

;fill the call gate data

xor eax,eax
LoopWrite:
movzx edi,byte ptr CallGateData[eax]

push edi
mov edi,Gdt_Addr
add edi,0x3e0
add edi,eax
push edi

mov Icount,eax
call WriteMemory
mov eax,Icount
inc eax
cmp eax,0x10
jnz LoopWrite


popad
popfd

}

}


void IntoR0(PVOID function)
{
WORD Callgt[3];
Callgt[0] = 0;
Callgt[1] = 0;
Callgt[2] = 0x3e3;
__asm
{
call fword ptr[Callgt]
mov eax,esp
mov esp,[esp+4]
push eax
call function
pop esp
push offset ring3Ret
retf
ring3Ret:
nop
}
return ;

}
调用IntoR0(你要执行的跳RING0代码函数地址)即可。

当然也可以使用一些kernel mode memory disclose 0day
IP 地址: 已记录   报告
   2009-09-03, 18:20 下午
xqj2002zm 离线,最后访问时间: 2010/6/24 5:19:33 Alex.xu

发帖数前50位
注册: 2009-07-23
发 贴: 21
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
Reply Quote
谢谢了, 虽然看不太懂(汇编很烂)~~
但是大致是理解了,就是加了一个中断门,然后自己手动触发该中断,这时候就进入ring 0 了.

当我的程序进入ring 0 了之后是不是意味着,我可以随便读取内核内存了?
IP 地址: 已记录   报告
   2009-09-03, 19:06 下午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
Reply Quote
我以前喜欢用 NtSystemDebugControl 虽然它基本会被拦
代码参考 randnut 的

PhysicalMemory 也一样
代码参考 Mark 的

Call Gate 可供参考的更多
我还看过吴岩峰前辈放出的一段演示代码 也很强大

最后
王道还是 kernel mode memory disclose 0day

嘿嘿~~
IP 地址: 已记录   报告
   2009-09-04, 09:46 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
Reply Quote

是的,这里疏忽了,原话是LIDT和SIDT指令......,应该不包括SIDT。

在早期的手册中,关于这条指令的描述是:

SGDT and SIDT are used only in operating system software; they are
not used in application programs.

后来改成王宇引用的样子。

本来是不希望应用层使用的,但是“希望”没管什么用......


IP 地址: 已记录   报告
   2009-09-05, 11:33 上午
xqj2002zm 离线,最后访问时间: 2010/6/24 5:19:33 Alex.xu

发帖数前50位
注册: 2009-07-23
发 贴: 21
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
Reply Quote
多谢各位前辈了~~
以前自己太俗了,一直在搞游戏开发,搞服务器开发,以为已经够底层了。后来,李建忠老师给我们做了一个培训,让我学会了从底层思维考虑问题。加上最近两年都在用windbg分析解决问题,让我体会到底层真的好美。为什么以前没有关注呢。
最近在看 linux内核和window internal5还有张老师的 软调。真的很难啃,个人感觉每本书侧重点都不同,而且不是每个点都非常深入(please correct me if I am wrong),还得求助各位牛人 希望自己能够坚持到底~~

上次还碰到一个问题:
就是全页堆模式下使用heap -s查看内存块的问题。为什么vista下面始终输出不了?难道需要打开某些参数? 因为我明明创建了1.5G的内存。但是heap -s看不到任何相关的堆信息。让我很诧异。但是我明明在XP下面测试成功过了。


IP 地址: 已记录   报告
高端调试 » 内核探秘 » Windows内核 » <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.